/**
 *
 */
package br.gov.ms.tce.cjur.acao;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.validation.ConstraintViolation;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.gov.ms.tce.bean.comum.DocumentoPessoal;
import br.gov.ms.tce.bean.comum.Email;
import br.gov.ms.tce.bean.comum.PessoaFisica;
import br.gov.ms.tce.bean.comum.Telefone;
import br.gov.ms.tce.bean.comum.TipoClassificacao;
import br.gov.ms.tce.bean.comum.Usuario;
import br.gov.ms.tce.bean.enumerator.ClassificacaoEnum;
import br.gov.ms.tce.cjur.service.PessoaService;
import br.gov.ms.tce.cjur.service.UsuarioService;
import br.gov.ms.tce.modelo.dao.TipoClassificacaoDAO;

/**
 * @author Anderson Paulino
 * @date 25/07/2011
 */
@Component("usuarioMB")
@Scope("session")
public class UsuarioMB extends AbstractMb implements Serializable {

	/**
	 * serialVersionUID:long
	 */
	private static final long serialVersionUID = 3670923090919009059L;

	@Inject
	private UsuarioService usuarioService;

	@Inject
	private PessoaService pessoaService;

	@Inject
	private TipoClassificacaoDAO tcDAO;

	private PessoaFisica pessoaFisica;

	private DocumentoPessoal rg;

	private DocumentoPessoal tituloEleitor;

	private Telefone telefone;

	private Telefone celular;

	private Email email;

	private Usuario usuario;

	private String confSenha;

	private List<TipoClassificacao> tipoSexos;

	/**
	 * username:String
	 */
	private String username;

	public void iniciarNovoRegistro() {
		tipoSexos = tcDAO.findByClassificacao(ClassificacaoEnum.TIPO_SEXO);
		pessoaFisica = new PessoaFisica();
		rg = new DocumentoPessoal(TipoClassificacao.TIPO_DOCUMENTO_PESSOAL_RG);
		tituloEleitor = new DocumentoPessoal(
				TipoClassificacao.TIPO_DOCUMENTO_PESSOAL_TITULO_DE_ELEITOR);
		telefone = new Telefone(TipoClassificacao.TIPO_TELEFONE_RESIDENCIAL);
		celular = new Telefone(TipoClassificacao.TIPO_TELEFONE_CELULAR);
		email = new Email(TipoClassificacao.TIPO_EMAIL_PROFISSIONAL);
		usuario = new Usuario();
		usuario.setPessoaFisica(pessoaFisica);
		pessoaFisica.getEmails().add(email);

		pessoaFisica.getUsuarios().add(usuario);
		pessoaFisica.getTelefones().add(telefone);
		pessoaFisica.getTelefones().add(celular);

		pessoaFisica.getDocumentoPessoals().add(rg);
		pessoaFisica.getDocumentoPessoals().add(tituloEleitor);

	}

	public void recuperarSenha(ActionEvent ae) {
		String msg = usuarioService.enviarEmailDeRecuperacaoDeSenha(username);
		FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Atenção", msg));
	}

	public void registrar() {
		Set<ConstraintViolation<PessoaFisica>> erros = pessoaService.salvar(pessoaFisica);
		if (!erros.isEmpty()) {
			setMsgErro(erros);
			
		}		
		setMsgInfo("usuario_registrar.sucesso");
	}

	/**
	 * @return Retorna o valor da propriedade username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade username
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @return Retorna o valor da propriedade pessoaFisica
	 */
	public PessoaFisica getPessoaFisica() {
		return pessoaFisica;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade pessoaFisica
	 */
	public void setPessoaFisica(PessoaFisica pessoaFisica) {
		this.pessoaFisica = pessoaFisica;
	}

	/**
	 * @return Retorna o valor da propriedade rg
	 */
	public DocumentoPessoal getRg() {
		return rg;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade rg
	 */
	public void setRg(DocumentoPessoal rg) {
		this.rg = rg;
	}

	/**
	 * @return Retorna o valor da propriedade tituloEleitor
	 */
	public DocumentoPessoal getTituloEleitor() {
		return tituloEleitor;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade tituloEleitor
	 */
	public void setTituloEleitor(DocumentoPessoal tituloEleitor) {
		this.tituloEleitor = tituloEleitor;
	}

	/**
	 * @return Retorna o valor da propriedade telefone
	 */
	public Telefone getTelefone() {
		return telefone;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade telefone
	 */
	public void setTelefone(Telefone telefone) {
		this.telefone = telefone;
	}

	/**
	 * @return Retorna o valor da propriedade celular
	 */
	public Telefone getCelular() {
		return celular;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade celular
	 */
	public void setCelular(Telefone celular) {
		this.celular = celular;
	}

	/**
	 * @return Retorna o valor da propriedade email
	 */
	public Email getEmail() {
		return email;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade email
	 */
	public void setEmail(Email email) {
		this.email = email;
	}

	/**
	 * @return Retorna o valor da propriedade usuario
	 */
	public Usuario getUsuario() {
		return usuario;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade usuario
	 */
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	/**
	 * @return Retorna o valor da propriedade tipoSexos
	 */
	public List<TipoClassificacao> getTipoSexos() {
		return tipoSexos;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade tipoSexos
	 */
	public void setTipoSexos(List<TipoClassificacao> tipoSexos) {
		this.tipoSexos = tipoSexos;
	}

	/**
	 * @return Retorna o valor da propriedade confSenha
	 */
	public String getConfSenha() {
		return confSenha;
	}

	/**
	 * @param Configura
	 *            o valor da propriedade confSenha
	 */
	public void setConfSenha(String confSenha) {
		this.confSenha = confSenha;
	}

}
